/**
@file ./src/sql/sqlite/index.js
@fileoverview 该模块负责与SQLite数据库进行交互，提供了获取列表数据、获取分页列表数据以及执行SQL语句的功能。
@author [ZouAnZu]
@version 1.0 
*/
var fs = require('fs');
const sqlite3 = require('sqlite3').verbose();
const config=require('../config')
const file=config.dbconfig.sqlite.file

/**
获取列表数据的函数
@function getList
@description 此函数用于执行SQL查询并获取列表数据。它创建一个SQLite数据库连接，执行传入的SQL查询，
并根据查询结果返回包含数据和操作结果信息的对象。如果查询过程中出现错误，会返回错误信息。
@param {string} sql - 要执行的SQL查询语句
@param {array} params - SQL查询语句中的参数数组
@returns {Promise} - 一个Promise对象，解析后返回的对象结构为：
{
code: 操作结果码（0表示失败，1表示成功）,
msg: 操作结果信息,
data: {
    recordset: 查询结果数组, 
    total: 查询结果的总数 
    }
}
*/ 
const getList = (sql, params) => {
    const db = new sqlite3.Database(file);

    return new Promise((resolve, reject) => {
        try {
            db.all(sql, params, (err, rows) => {
                if (err) {
                    // 错误处理
                    reject({
                        code: 0,
                        msg: err.message + ' - SQL: ' + sql,
                        data: {
                            items: [],
                            total: 0
                        }
                    });
                } else {
                    // 成功返回数据
                    resolve({
                        code: 1,
                        msg: 'success',
                        data: {
                            recordset: rows,
                            total: rows.length
                        }
                    });
                }
            });
        } catch (err) {
            // 捕获同步错误
            reject({
                code: 0,
                msg: err.message,
                data: {
                    items: [],
                    total: 0
                }
            });
        } finally {
            // 确保数据库连接关闭
            db.close();
        }
    });
};

/**
获取分页列表数据的函数
@function getPageList
@description 此函数用于获取分页列表数据。它首先调用getList函数查询数据总数，如果总数大于0，则再次调用getList函数获取分页数据，并将分页数据合并到结果对象中返回。
@param {object} sqls - 包含两个SQL语句和对应参数的对象，结构为{sql1: '查询总数的SQL', arge1: [查询总数的参数], sql2: '查询分页数据的SQL', arge2: [查询分页数据的参数]}
@returns {Promise} - 一个Promise对象，解析后返回的对象结构为：
{
    code: 操作结果码（0表示失败，1表示成功）,
    msg: 操作结果信息,
    data: {
        recordset: 分页查询结果数组, 
        total: 数据总数 
    }
} 
*/ 
const getPageList=async (sqls)=>{
    const result=await getList(sqls.sql1,sqls.arge1)
    if (result.data.total>0){
        const data=await getList(sqls.sql2,sqls.arge2)
        result.data.recordset=[...data.data.recordset]
    }
    return result
}

/**
执行SQL语句的函数
@function exec
@description 此函数用于执行各种SQL语句，如插入、更新、删除等操作。它创建一个SQLite数据库连接，执行传入的SQL语句，并根据执行结果返回包含操作结果信息的对象。如果执行过程中出现错误，会返回错误信息。
@param {string} sql - 要执行的SQL语句
@param {array} params - SQL语句中的参数数组
@returns {Promise} - 一个Promise对象，解析后返回的对象结构为：
{
    code: 操作结果码（0表示失败，1表示成功）,
    msg: 操作结果信息,
    insertId: 最后插入行的ID（如果有）,
    affectedRows: 受影响的行数
} */
const exec=(sql,params)=>{
    const db = new sqlite3.Database(file);

    return new Promise((resolve, reject) => {
        try {
            db.run(sql, params, (err) => {
                if (err) {
                    // 错误处理
                    reject({
                        code: 0,
                        msg: err.message + ' - SQL: ' + sql,
                        affectedRows:0
                    });
                } else {
                    // 成功返回数据
                    resolve({
                        code: 1,
                        msg: 'success',
                        insertId:this.lastID??'',
                        affectedRows: this.changes??0
                    });
                }
            });
        } catch (err) {
            // 捕获同步错误
            reject({
                code: 0,
                msg: err.message,
                data: {
                    items: [],
                    total: 0
                }
            });
        } finally {
            // 确保数据库连接关闭
            db.close();
        }
    });
}
module.exports = {
    getList,
    getPageList,
    exec
};